package com.alg.pattern.singleton;

/**
 * 线程安全的单例模式 (面试必背)
 * https://blog.csdn.net/jipf062251/article/details/77684608
 */
public class Singleton {
    /**
     * 懒汉模式/饥饿模式 区别
     * 饥饿模式 未使用先初始化，效率快/占用资源
     * 懒汉模式 使用再初始化，  效率低/不占资源
     */

    // 使用volatile阻止synchronize代码块内指令重排
    private static volatile Singleton instance = null;

    private Singleton() { }

    public static Singleton getInstance() {
        // 双重检测
        if(instance == null) {
            synchronized(Singleton.class) {
                if(instance == null) {
                    instance = new Singleton();
                }
            }
        }

        return instance;
    }

}